import decimal
from PyQt5 import QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QGridLayout, QHBoxLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QVBoxLayout,QWidget
import sys
class tWindow(QWidget):
    
    def __init__(self) -> None:
        super().__init__()
        self.firstnum = '' # 记录输入的第一个数据
        self.secondnum = ''# 记录输入的第二个数据
        self.fuhao = ''# 记录输入的算数运算符信息
        self.beforestr = '' # 记录点击该按钮之前的点击信息
        self.inittabUI() # 初始化界面方法
        
    def numys(self):  # 对两个数进行操作
        if self.fuhao == '+': # '0.12' + '0.21'
            return decimal.Decimal(self.firstnum) + decimal.Decimal(self.secondnum)
        elif self.fuhao == '-':
            return decimal.Decimal(self.firstnum) - decimal.Decimal(self.secondnum)
        elif self.fuhao == '*':
            return decimal.Decimal(self.firstnum) * decimal.Decimal(self.secondnum)
        elif self.fuhao == '/':
            return decimal.Decimal(self.firstnum) / decimal.Decimal(self.secondnum)
    def click(self): # 所有按钮的点击事件
        key = self.sender().text() # 获取所点击按钮的值
        # 如果输入的是运算符号，则清空文本框数据并记录
        if key in ('+','-','*','/'): # 根据值的不同来确定那个按钮被点击
            text = self.qline.text() # 获取文本框的值
            '''
                和实体计算器一样，文本框默认值是0
                本步骤是为了拼接第二个数的逻辑 
                如果不为0则存储数据和符号'''
            if text != '' and self.fuhao == '': 
                self.firstnum += text # 如果不为0说明，文本框有值，符号为空，说明此次输入为第一次输入。故存储第一个值
                self.fuhao = key # 并将符号进行存储
            elif text != '' and self.fuhao != '':
                # if self.beforestr in '+-*/':
                #     self.beforestr = key
                #     self.fuhao = key
                self.secondnum = text # 如果符号不为空，且文本框有值
                # 将运算结果放在上面
                self.qline.setText(self.numys()) #调用运算方法并给文本框进行设置
                self.firstnum = self.numys() # 然后将该值赋给第一个值，是为了存储前面的结果给下一次计算使用，功能正在实现中。。。。。
            self.beforestr = key # 最后记录本次点击的痕迹                    
        # 如果输入的是等于号，则将运算结果展示在文本框
        elif key in ('0','1','2','3','4','5','6','7','8','9','.'):            
            if self.beforestr in ('+','-','*','/'):  #如果上一次输入是运算符，清空，重新输入第二个值
                self.qline.clear()
                text = self.qline.text()
                text += key
                while(text[0] == ''):
                    text = text[1:]
                self.qline.setText(text) 
            else: # 如果不是的话，追加到数值上面
                '''追加数字'''
                text = self.qline.text()
                text += key
                while(text[0] == ''):
                    text = text[1:]
                self.qline.setText(text)           
            self.beforestr = key
        # 如果输入的Cls则将 数据清空
        elif key == 'Cls':
            self.firstnum = ''
            self.secondnum = ''
            self.fuhao = ''
            self.qline.clear() #将所有值清空，将文本框的值设置成默认值
        elif key == 'Bck':
            text = self.qline.text()
            text = text[-len(text):-1] # 利用切片一直切到最后一位
            self.qline.setText(text)
        elif key == '=': 
            text = self.qline.text()  #如果点等于的话，直接获取文本框的数值
            self.secondnum = text
            sum = self.numys() # 进行运算
            #符号清空
            self.qline.setText(str(sum)) # 将总和设置到文本框上面
            self.fuhao = '' # 对符号进行清空
            self.firstnum = ''
            self.secondnum = ''
    def inittabUI(self):
        # 添加文本框
        self.qline = QLineEdit()
        self.qline.setPlaceholderText('0')
        self.qline.setAlignment(QtCore.Qt.AlignRight)
        # self.qline.setEnabled(False)
        self.qline.setFocusPolicy(QtCore.Qt.NoFocus)
        grid = QGridLayout()
        self.setLayout(grid)
        names = ['Cls', 'Bck', 'CE', 'Close',
                 '7', '8', '9', '/',
                '4', '5', '6', '*',
                 '1', '2', '3', '-',
                '0', '.', '=', '+']
        positions = [(i,j) for i in range(1,6) for j in range(4)]
        
        grid.addWidget(self.qline,0,0,1,4)
        for position,name in zip(positions,names):
            button = QPushButton(name)
            button.clicked.connect(self.click)
            grid.addWidget(button, *position)
        # self.move(300, 150)
        self.setWindowTitle('Calculator')
        # self.setFixedSize(self.width(), self.height());  
        self.setWindowIcon(QIcon(r'D:\workspace\pyqt入门\b11.png'))
        self.show()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    tw = tWindow()
    sys.exit(app.exec_())